#include <iostream>

using std::cout;
using std::endl;

class Point {
public:
    Point(int ix = 0, int iy = 0)
    : _ix(ix)
    , _iy(iy)
    {   cout << "Point(int,int)" << endl;}

    //非const版本
    //this指针的形式： Point * const this
    //编译时，编译器会自动加上this指针
#if 0
    void print() 
    {
        cout << "print()" << endl;
        _ix = 100;//ok
        cout << "(" << _ix 
             << "," << _iy
             << ")" << endl;
    }
#endif

    //const版本
    //this指针的形式: Point const * const this
    //const关键字的作用是修改了this指针的形式
    void print() const  
    {
        cout << "print() const" << endl;
        //const成员函数内部无法修改数据成员，只能读取数据成员
        //this->_ix = 1000;//error
        cout << "(" << this->_ix 
             << "," << this->_iy
             << ")" << endl;
    }

private:
    int _ix;
    int _iy;
};

int main()
{
    cout << "sizeof(Point):" << sizeof(Point) << endl;
    const Point pt(10, 11);//const对象调用const版本的成员函数
    cout << "pt:";
    pt.print();
    //1. 当两个版本都存在时，非const对象调用非const版本的成员函数
    //2. 当只有const版本的成员函数时，非const对象依然可以调用const成员函数
    Point pt2;
    cout << "pt2:";
    pt2.print();

    return 0;
}

